/**
 * 
 */
package mm.back.dao.impl;

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;

import genericos.dao.exeptions.PersistanceException;
import genericos.dao.exeptions.PersistenceServiceException;
import mm.back.dao.MMAbstractDAO;
import mm.back.dao.RubroDAO;
import mm.back.entity.Rubro;
import mm.back.filtros.RubrosFiltro;
import mm.exceptions.MMGenericException;

/**
 * @author PUSDERKIS
 *
 */
public class RubroDAOImpl extends MMAbstractDAO implements RubroDAO {

	/** 
	 * @see mm.back.dao.RubroDAO#createRubro(java.lang.String)
	 */
	public Rubro createRubro(String nombre) throws MMGenericException {
		Rubro rub = new Rubro();
		rub.setNombre(nombre);
		rub.setActivo(true);
		try{
			universalHibernateDAO.save(rub);
			return rub;
		} catch (PersistenceServiceException e) {
			logger.error("Error al recuperar el usuario: ",e);
			throw new MMGenericException("Error al recuperar el usuario", e);
		}
	}

	/** 
	 * @see mm.back.dao.RubroDAO#findRubros(java.lang.String, java.lang.Boolean)
	 */
	@SuppressWarnings("unchecked")
	public List<Rubro> findRubros(RubrosFiltro filtro)
			throws MMGenericException {

		String sQuery="FROM Rubro rub WHERE 1=1 ";
		
		sQuery += filtro.getWhereClause("rub");
		
		sQuery += " ORDER By rub.nombre ASC";
		
		try{
			Query query = universalHibernateDAO.getHibernateSession().createQuery(sQuery);
			
			filtro.setWhereParameters(query);
			
			return query.list();
		} catch (PersistenceServiceException e) {
			logger.error("Error al recuperar la lista de rubros: ",e);
			throw new MMGenericException("Error al recuperar la lista de rubros", e);
		} catch (HibernateException e) {
			logger.error("Error al recuperar la lista de rubros: ",e);
			throw new MMGenericException("Error al recuperar la lista de rubros", e);
		} catch (PersistanceException e) {
			logger.error("Error al recuperar la lista de rubros: ",e);
			throw new MMGenericException("Error al recuperar la lista de rubros", e);
		}
	}

	@SuppressWarnings("unchecked")
	public List <Rubro> filtrarNombre(String nombre) throws MMGenericException {
		
		String sQuery="FROM Rubro rub WHERE rub.nombre like '%:nombre%' ";
		try{
			Query query = universalHibernateDAO.getHibernateSession().createQuery(sQuery);
			query.setString("nombre", nombre);
			
			
			return query.list();
		} catch (PersistenceServiceException e) {
			logger.error("Error al recuperar la lista de rubros: ",e);
			throw new MMGenericException("Error al recuperar la lista de rubros", e);
		} catch (HibernateException e) {
			logger.error("Error al recuperar la lista de rubros: ",e);
			throw new MMGenericException("Error al recuperar la lista de rubros", e);
		} catch (PersistanceException e) {
			logger.error("Error al recuperar la lista de rubros: ",e);
			throw new MMGenericException("Error al recuperar la lista de rubros", e);
		}
	}

	/** 
	 * @see mm.back.dao.RubroDAO#getRubro(java.lang.Long)
	 */
	public Rubro getRubro(Long id) throws MMGenericException {
		
		try{
			Rubro r = (Rubro) universalHibernateDAO.get(Rubro.class, id);
			return r;
		} catch (PersistenceServiceException e) {
			logger.error("Error al recuperar el rubro con ID: "+id,e);
			throw new MMGenericException("Error al recuperar el rubro con ID: "+id,e);
		} catch (HibernateException e) {
			logger.error("Error al recuperar el rubro con ID: "+id,e);
			throw new MMGenericException("Error al recuperar el rubro con ID: "+id,e);
		}
	}

	public Rubro saveRubro(Rubro rubro) throws MMGenericException {
		
		try{
			if (logger.isDebugEnabled()){
				logger.debug("Se intenta guardar el producto...");
			}
			universalHibernateDAO.saveOrUpdate(rubro);
			if(logger.isDebugEnabled()){
				logger.debug("Rubro guardado correctamente. ID: "+rubro.getId());
			}
			
		} catch (PersistenceServiceException e) {
			logger.error("Fallo al insertar el producto en la base de datos.",e);
			throw new MMGenericException(e.getMessage(),e);
		}
		
		return null;
	}

	public Rubro searchRubro(String nombre) throws MMGenericException {
		
		String sQuery="FROM Rubro rub WHERE lower(rub.nombre) = :nombre ";
		try{
			Query query = universalHibernateDAO.getHibernateSession().createQuery(sQuery);
			query.setString("nombre", nombre.toLowerCase());
			
			
			return (Rubro) query.uniqueResult();
		} catch (PersistenceServiceException e) {
			logger.error("Error al recuperar la lista de rubros: ",e);
			throw new MMGenericException("Error al recuperar la lista de rubros", e);
		} catch (HibernateException e) {
			logger.error("Error al recuperar la lista de rubros: ",e);
			throw new MMGenericException("Error al recuperar la lista de rubros", e);
		} catch (PersistanceException e) {
			logger.error("Error al recuperar la lista de rubros: ",e);
			throw new MMGenericException("Error al recuperar la lista de rubros", e);
		}
	}
	
	

}
